1073. 负二进制数相加【中等】
1. 📝 题目描述
给出基数为 -2 的两个数 arr1 和 arr2,返回两数相加的结果。
数字以 数组形式 给出:数组由若干 0 和 1 组成,按最高有效位到最低有效位的顺序排列。例如,arr = [1,1,0,1] 表示数字 (-2)^3 + (-2)^2 + (-2)^0 = -3。数组形式 中的数字 arr 也同样不含前导零:即 arr == [0] 或 arr[0] == 1。
返回相同表示形式的 arr1 和 arr2 相加的结果。两数的表示形式为:不含前导零、由若干 0 和 1 组成的数组。
示例 1:
txt
输入:arr1 = [1,1,1,1,1], arr2 = [1,0,1]
输出:[1,0,0,0,0]
解释:arr1 表示 11,arr2 表示 5,输出表示 16。1
2
3
2
3
示例 2:
txt
输入:arr1 = [0], arr2 = [0]
输出:[0]1
2
2
示例 3:
txt
输入:arr1 = [0], arr2 = [1]
输出:[1]1
2
2
提示:
1 <= arr1.length, arr2.length <= 1000arr1[i]和arr2[i]都是0或1arr1和arr2都没有前导 0
2. 🎯 s.1 - 模拟进位
js
/**
* @param {number[]} arr1
* @param {number[]} arr2
* @return {number[]}
*/
var addNegabinary = function (arr1, arr2) {
const res = []
let i = arr1.length - 1,
j = arr2.length - 1,
carry = 0
while (i >= 0 || j >= 0 || carry !== 0) {
let sum = carry
if (i >= 0) sum += arr1[i--]
if (j >= 0) sum += arr2[j--]
res.push(sum & 1)
carry = -(sum >> 1)
}
while (res.length > 1 && res[res.length - 1] === 0) res.pop()
return res.reverse()
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- 时间复杂度:
,其中 、 分别是两个数组的长度 - 空间复杂度:
,结果数组的长度
算法思路:
- 从低位到高位逐位相加,维护进位 carry
- 在 -2 进制中,当 sum 为 2 或 3 时,当前位取
sum & 1,进位为-(sum >> 1) - 即进位为负数(对应 -2 的底数特性),最后去除前导零